package com.example.platine.database;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.platine.model.*;

public class ReveilBDD {
	private static final int VERSION_BDD = 1;
	private static final String NOM_BDD = "reveil.db";    
	private static final String TABLE_REVEIL = "table_reveil";
	private static final String COL_ID = "ID";
	private static final int NUM_COL_ID = 0;
	private static final String COL_IDUSER = "ID_User" ;
	private static final int NUM_COL_IDUSER = 1;
	private static final String COL_HEURE = "heure" ;
	private static final int NUM_COL_HEURE = 2;
	private static final String COL_MINUTE = "minute" ;
	private static final int NUM_COL_MINUTE = 3;
	private static final String COL_REPETER = "repeter" ;
	private static final int NUM_COL_REPETER = 4;
	private static final String COL_DESCRIPTION = "Description" ;
	private static final int NUM_COL_DESCRIPTION = 5;

	private SQLiteDatabase bdd;
	private Base maBase;

	public ReveilBDD(Context context){
		//On cr�er la BDD et sa table
		maBase = new Base(context, NOM_BDD, null, VERSION_BDD);
	}

	public void open(){
		//on ouvre la BDD en �criture
		bdd = maBase.getWritableDatabase();
	}

	public void close(){
		//on ferme l'acc�s � la BDD
		bdd.close();
	}

	public SQLiteDatabase getBDD(){
		return bdd;
	}

	public long insertReveil(Reveil reveil){
		//Cr�ation d'un ContentValues (fonctionne comme une HashMap)
		ContentValues values = new ContentValues();
		//on lui ajoute une valeur associ� � une cl� (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
		values.put(COL_ID, reveil.getId()) ;
		values.put(COL_IDUSER, reveil.getIdUser()) ;
		values.put(COL_HEURE, reveil.getHeure()) ;
		values.put(COL_MINUTE, reveil.getMinute()) ;
		values.put(COL_REPETER, reveil.getRepeter()) ;
		values.put(COL_DESCRIPTION, reveil.getDescription()) ;
		//on ins�re l'objet dans la BDD via le ContentValues
		return bdd.insert(TABLE_REVEIL, null, values) ;
	}

	public Reveil getReveilWithId(int id, int idUser){
		//R�cup�re dans un Cursor les valeur correspondant � une demande contenu dans la BDD (ici on s�lectionne les demandes grace a son login)
		Cursor c = bdd.query(TABLE_REVEIL, new String[] {COL_ID, COL_IDUSER, COL_HEURE, COL_MINUTE, COL_REPETER, COL_DESCRIPTION}, COL_ID + " = \"" + id +"\" AND " + COL_IDUSER + " = \"" + idUser + "\"", null, null, null, null);
		return cursorToReveil(c);
	}

	public ArrayList<Reveil> getReveilWithIdUser(int idUser){
		//R�cup�re dans un Cursor les valeur correspondant � une demande contenu dans la BDD (ici on s�lectionne les demandes grace a son login)
		Cursor c = bdd.query(TABLE_REVEIL, new String[] {COL_ID, COL_IDUSER, COL_HEURE, COL_MINUTE, COL_REPETER, COL_DESCRIPTION}, COL_IDUSER + " = \"" + idUser + "\"", null, null, null, null);
		return cursorToReveils(c);
	}

	public ArrayList<Reveil> getALLReveil(){
		//R�cup�re dans un Cursor les valeur correspondant � une demande contenu dans la BDD (ici on s�lectionne les demandes grace a son login)
		Cursor c = bdd.query(TABLE_REVEIL, new String[] {COL_ID, COL_IDUSER, COL_HEURE, COL_MINUTE, COL_REPETER, COL_DESCRIPTION}, null, null, null, null, null);
		return cursorToReveils(c);
	}

	//Cette m�thode permet de convertir un cursor en un User
	private Reveil cursorToReveil(Cursor c){
		//si aucun element n'a ete retourne dans la requete, on renvoie null
		if (c.getCount() == 0)
			return null;

		Reveil reveil = new Reveil() ;

		c.moveToFirst();

		reveil.setId(c.getInt(NUM_COL_ID)) ;
		reveil.setIdUser(c.getInt(NUM_COL_IDUSER)) ;
		reveil.setHeure(c.getInt(NUM_COL_HEURE)) ;
		reveil.setMinute(c.getInt(NUM_COL_MINUTE)) ;
		reveil.setRepeter(c.getString(NUM_COL_REPETER));
		reveil.setDescription(c.getString(NUM_COL_DESCRIPTION));

		//On ferme le cursor
		c.close();

		//On retourne le reveil
		return reveil;
	}

	private ArrayList<Reveil> cursorToReveils(Cursor c){
		//si aucun element n'a ete retourne dans la requete, on renvoie null
		if (c.getCount() == 0)
			return null;

		ArrayList<Reveil> reveils = new ArrayList<Reveil>() ;

		c.moveToFirst();

		do{
			//On cree une demande
			Reveil reveil = new Reveil() ;

			//on lui affecte toutes les infos grace aux infos contenues dans le Cursor
			reveil.setId(c.getInt(NUM_COL_ID)) ;
			reveil.setIdUser(c.getInt(NUM_COL_IDUSER)) ;
			reveil.setHeure(c.getInt(NUM_COL_HEURE)) ;
			reveil.setMinute(c.getInt(NUM_COL_MINUTE)) ;
			reveil.setRepeter(c.getString(NUM_COL_REPETER));
			reveil.setDescription(c.getString(NUM_COL_DESCRIPTION));
			reveils.add(reveil) ;
		}while(c.moveToNext()) ;


		//On ferme le cursor
		c.close();

		//On retourne le reveil
		return reveils;
	}

	public int updateReveil(Reveil reveil){
		ContentValues values = new ContentValues();
		values.put(COL_IDUSER, reveil.getIdUser()) ;
		values.put(COL_HEURE, reveil.getHeure()) ;
		values.put(COL_MINUTE, reveil.getMinute()) ;
		values.put(COL_REPETER, reveil.getRepeter()) ;
		values.put(COL_DESCRIPTION, reveil.getDescription()) ;
		return bdd.update(TABLE_REVEIL, values, COL_ID + " = " +reveil.getId(), null);
	}

	public int removeReveilWithID(int id, int idUser){
		return bdd.delete(TABLE_REVEIL, COL_ID + " = " +id + " AND " + COL_IDUSER + " = " + idUser, null);
	}

	public void clear(){
		bdd.execSQL("DELETE FROM " + TABLE_REVEIL + ";");

	}   

}